﻿#include <iostream>
#include "SlidingWindow.h"

static int* getMaxValues(const int* numbers, size_t size, size_t windowSize)
{
    SlidingWindow slidingWindow = SlidingWindow(numbers, size);
    if (windowSize >= size)
    {
        for (int i = 0; i < size; i++)
        {
            slidingWindow.stepRight();
        }

        int* arr = (int*)malloc(sizeof(int));
        arr[0] = slidingWindow.maxValue();
        return arr;
    }

    size_t times = size - windowSize + 1;
    int* arr = (int*)malloc(sizeof(int) * times);
    for (int i = 0; i < windowSize; i++)
    {
        slidingWindow.stepRight();
    }

    arr[0] = slidingWindow.maxValue();
    int index = 1;
    while (index < times)
    {
        slidingWindow.stepRight();
        slidingWindow.stepLeft();
        arr[index++] = slidingWindow.maxValue();
    }

    return arr;
}

// 有一个整型数组arr和一个大小为w的窗口从数组的最左侧滑动到最右侧，窗口每次向右滑动一个位置。
// 例如，数组为[4, 3, 5, 4, 3, 3, 6, 7], 窗口大小为3时:
//
//[4 3 5] 4 3 3 6 7
// 4[3 5 4] 3 3 6 7
// 4 3[5 4 3] 3 6 7
// 4 3 5[4 3 3] 6 7
// 4 3 5 4[3 3 6] 7
// 4 3 5 4 3[3 6 7]
//
//窗口中最大值分别为: 5, 5, 5, 4, 6, 7.
//
//如果数组长度为n，窗口大小为w，则一共产生n - w + 1个窗口的最大值。
// 请实现一个函数，输入 : 整型数组arr，窗口大小为w。
// 输出 : 一个长度为n - w + 1的数组res，res[i]表示每一种窗口状态下的最大值，以本题为例，结果应该返回：
// { 5,5,5,4,6,7 }
int main_MaxValueInWindow()
{
    int numbers[] = { 8,55,63,12,123,54,23,78,59,80 };
    size_t size = sizeof(numbers) / sizeof(int);
    size_t windowSize = size;
    auto res = getMaxValues(numbers, size, windowSize);
    int edge = (int)size - (int)windowSize + 1;
    if (edge <= 1)
    {
        printf("%d", res[0]);
    }
    else
    {
        for (int i = 0; i < (int)size - (int)windowSize + 1; i++)
        {
            printf("%d,", res[i]);
        }
    }

    free(res);
    printf("\n");
    return 0;
}